aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/CodeGen/MachineVerifier.cpp
diff options
context:
space:
mode:
authorpaperchalice <liujunchang97@outlook.com>2024-07-15 12:42:44 +0800
committerGitHub <noreply@github.com>2024-07-15 12:42:44 +0800
commitc09ed6a29e392e406623f7c4dc0a8240d2cbc9f2 (patch)
treeded226b4178238857616012f6e065cf5eb2a80da /llvm/lib/CodeGen/MachineVerifier.cpp
parente025e5ef44b736b48b8a2ee230a11f674b734b32 (diff)
downloadllvm-c09ed6a29e392e406623f7c4dc0a8240d2cbc9f2.zip
llvm-c09ed6a29e392e406623f7c4dc0a8240d2cbc9f2.tar.gz
llvm-c09ed6a29e392e406623f7c4dc0a8240d2cbc9f2.tar.bz2
[CodeGen][NewPM] Port `MachineVerifier` to new pass manager (#98628)
- Add `MachineVerifierPass`. - Use complete `MachineVerifierPass` in `VerifyInstrumentation` if possible. `LiveStacksAnalysis` will be added in future, all other analyses are done.
Diffstat (limited to 'llvm/lib/CodeGen/MachineVerifier.cpp')
-rw-r--r--llvm/lib/CodeGen/MachineVerifier.cpp44
1 files changed, 36 insertions, 8 deletions
diff --git a/llvm/lib/CodeGen/MachineVerifier.cpp b/llvm/lib/CodeGen/MachineVerifier.cpp
index d0d3af0..0a5b8bd 100644
--- a/llvm/lib/CodeGen/MachineVerifier.cpp
+++ b/llvm/lib/CodeGen/MachineVerifier.cpp
@@ -20,6 +20,7 @@
// -verify-machineinstrs.
//===----------------------------------------------------------------------===//
+#include "llvm/CodeGen/MachineVerifier.h"
#include "llvm/ADT/BitVector.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/DenseSet.h"
@@ -93,6 +94,9 @@ using namespace llvm;
namespace {
struct MachineVerifier {
+ MachineVerifier(MachineFunctionAnalysisManager &MFAM, const char *b)
+ : MFAM(&MFAM), Banner(b) {}
+
MachineVerifier(Pass *pass, const char *b) : PASS(pass), Banner(b) {}
MachineVerifier(const char *b, LiveVariables *LiveVars,
@@ -103,6 +107,7 @@ namespace {
unsigned verify(const MachineFunction &MF);
+ MachineFunctionAnalysisManager *MFAM = nullptr;
Pass *const PASS = nullptr;
const char *Banner;
const MachineFunction *MF = nullptr;
@@ -302,15 +307,15 @@ namespace {
void verifyProperties(const MachineFunction &MF);
};
- struct MachineVerifierPass : public MachineFunctionPass {
+ struct MachineVerifierLegacyPass : public MachineFunctionPass {
static char ID; // Pass ID, replacement for typeid
const std::string Banner;
- MachineVerifierPass(std::string banner = std::string())
- : MachineFunctionPass(ID), Banner(std::move(banner)) {
- initializeMachineVerifierPassPass(*PassRegistry::getPassRegistry());
- }
+ MachineVerifierLegacyPass(std::string banner = std::string())
+ : MachineFunctionPass(ID), Banner(std::move(banner)) {
+ initializeMachineVerifierLegacyPassPass(*PassRegistry::getPassRegistry());
+ }
void getAnalysisUsage(AnalysisUsage &AU) const override {
AU.addUsedIfAvailable<LiveStacks>();
@@ -338,13 +343,28 @@ namespace {
} // end anonymous namespace
-char MachineVerifierPass::ID = 0;
+PreservedAnalyses
+MachineVerifierPass::run(MachineFunction &MF,
+ MachineFunctionAnalysisManager &MFAM) {
+ // Skip functions that have known verification problems.
+ // FIXME: Remove this mechanism when all problematic passes have been
+ // fixed.
+ if (MF.getProperties().hasProperty(
+ MachineFunctionProperties::Property::FailsVerification))
+ return PreservedAnalyses::all();
+ unsigned FoundErrors = MachineVerifier(MFAM, Banner.c_str()).verify(MF);
+ if (FoundErrors)
+ report_fatal_error("Found " + Twine(FoundErrors) + " machine code errors.");
+ return PreservedAnalyses::all();
+}
+
+char MachineVerifierLegacyPass::ID = 0;
-INITIALIZE_PASS(MachineVerifierPass, "machineverifier",
+INITIALIZE_PASS(MachineVerifierLegacyPass, "machineverifier",
"Verify generated machine code", false, false)
FunctionPass *llvm::createMachineVerifierPass(const std::string &Banner) {
- return new MachineVerifierPass(Banner);
+ return new MachineVerifierLegacyPass(Banner);
}
void llvm::verifyMachineFunction(const std::string &Banner,
@@ -438,6 +458,14 @@ unsigned MachineVerifier::verify(const MachineFunction &MF) {
auto *SIWrapper = PASS->getAnalysisIfAvailable<SlotIndexesWrapperPass>();
Indexes = SIWrapper ? &SIWrapper->getSI() : nullptr;
}
+ if (MFAM) {
+ MachineFunction &Func = const_cast<MachineFunction &>(MF);
+ LiveInts = MFAM->getCachedResult<LiveIntervalsAnalysis>(Func);
+ if (!LiveInts)
+ LiveVars = MFAM->getCachedResult<LiveVariablesAnalysis>(Func);
+ // TODO: LiveStks = MFAM->getCachedResult<LiveStacksAnalysis>(Func);
+ Indexes = MFAM->getCachedResult<SlotIndexesAnalysis>(Func);
+ }
verifySlotIndexes();