diff options
| author | Puyan Lotfi <puyan@puyan.org> | 2019-09-05 20:44:33 +0000 |
|---|---|---|
| committer | Puyan Lotfi <puyan@puyan.org> | 2019-09-05 20:44:33 +0000 |
| commit | dc97ca9f25aca6d14981a889748fd0810e2dd0e8 (patch) | |
| tree | 6a3a559b98e0eab69fcde63c38a113873f51df0a /llvm/lib | |
| parent | bf7602b261c7167966c6ae5cf153f6e4847ace3b (diff) | |
| download | bcm5719-llvm-dc97ca9f25aca6d14981a889748fd0810e2dd0e8.tar.gz bcm5719-llvm-dc97ca9f25aca6d14981a889748fd0810e2dd0e8.zip | |
[MIR] MIRNamer pass for improving MIR test authoring experience.
This patch reuses the MIR vreg renamer from the MIRCanonicalizerPass to cleanup
names of vregs in a MIR file for MIR test authors. I found it useful when
writing a regression test for a globalisel failure I encountered recently and
thought it might be useful for other folks as well.
Differential Revision: https://reviews.llvm.org/D67209
llvm-svn: 371121
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/CodeGen/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/CodeGen.cpp | 1 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/MIRNamerPass.cpp | 77 |
3 files changed, 79 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/CMakeLists.txt b/llvm/lib/CodeGen/CMakeLists.txt index 1228a2d1c6c..3cf0c60108e 100644 --- a/llvm/lib/CodeGen/CMakeLists.txt +++ b/llvm/lib/CodeGen/CMakeLists.txt @@ -122,6 +122,7 @@ add_llvm_library(LLVMCodeGen RegisterScavenging.cpp RenameIndependentSubregs.cpp MIRVRegNamerUtils.cpp + MIRNamerPass.cpp MIRCanonicalizerPass.cpp RegisterUsageInfo.cpp RegUsageInfoCollector.cpp diff --git a/llvm/lib/CodeGen/CodeGen.cpp b/llvm/lib/CodeGen/CodeGen.cpp index 51be4e3af01..d369160b299 100644 --- a/llvm/lib/CodeGen/CodeGen.cpp +++ b/llvm/lib/CodeGen/CodeGen.cpp @@ -54,6 +54,7 @@ void llvm::initializeCodeGen(PassRegistry &Registry) { initializeLocalStackSlotPassPass(Registry); initializeLowerIntrinsicsPass(Registry); initializeMIRCanonicalizerPass(Registry); + initializeMIRNamerPass(Registry); initializeMachineBlockFrequencyInfoPass(Registry); initializeMachineBlockPlacementPass(Registry); initializeMachineBlockPlacementStatsPass(Registry); diff --git a/llvm/lib/CodeGen/MIRNamerPass.cpp b/llvm/lib/CodeGen/MIRNamerPass.cpp new file mode 100644 index 00000000000..9d719f3917c --- /dev/null +++ b/llvm/lib/CodeGen/MIRNamerPass.cpp @@ -0,0 +1,77 @@ +//===----------------------- MIRNamer.cpp - MIR Namer ---------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// The purpose of this pass is to rename virtual register operands with the goal +// of making it easier to author easier to read tests for MIR. This pass reuses +// the vreg renamer used by MIRCanonicalizerPass. +// +// Basic Usage: +// +// llc -o - -run-pass mir-namer example.mir +// +//===----------------------------------------------------------------------===// + +#include "MIRVRegNamerUtils.h" +#include "llvm/ADT/PostOrderIterator.h" +#include "llvm/ADT/STLExtras.h" +#include "llvm/CodeGen/MachineFunctionPass.h" +#include "llvm/CodeGen/MachineInstrBuilder.h" +#include "llvm/CodeGen/MachineRegisterInfo.h" +#include "llvm/CodeGen/Passes.h" + +using namespace llvm; + +namespace llvm { +extern char &MIRNamerID; +} // namespace llvm + +#define DEBUG_TYPE "mir-namer" + +namespace { + +class MIRNamer : public MachineFunctionPass { +public: + static char ID; + MIRNamer() : MachineFunctionPass(ID) {} + + StringRef getPassName() const override { + return "Rename virtual register operands"; + } + + void getAnalysisUsage(AnalysisUsage &AU) const override { + AU.setPreservesCFG(); + MachineFunctionPass::getAnalysisUsage(AU); + } + + bool runOnMachineFunction(MachineFunction &MF) override { + bool Changed = false; + + if (MF.empty()) + return Changed; + + NamedVRegCursor NVC(MF.getRegInfo()); + + ReversePostOrderTraversal<MachineBasicBlock *> RPOT(&*MF.begin()); + for (auto &MBB : RPOT) + Changed |= NVC.renameVRegs(MBB); + + return Changed; + } +}; + +} // end anonymous namespace + +char MIRNamer::ID; + +char &llvm::MIRNamerID = MIRNamer::ID; + +INITIALIZE_PASS_BEGIN(MIRNamer, "mir-namer", "Rename Register Operands", false, + false) + +INITIALIZE_PASS_END(MIRNamer, "mir-namer", "Rename Register Operands", false, + false) |

