mirror of
https://github.com/RPCSX/llvm.git
synced 2025-01-03 10:19:18 +00:00
e77eb6a23d
Running tests with expensive checks enabled exhibits some problems with verification of pass results. First, the pass verification may require results of analysis that are not available. For instance, verification of loop info requires results of dominator tree analysis. A pass may be marked as conserving loop info but does not need to be dependent on DominatorTreePass. When a pass manager tries to verify that loop info is valid, it needs dominator tree, but corresponding analysis may be already destroyed as no user of it remained. Another case is a pass that is skipped. For instance, entities with linkage available_externally do not need code generation and such passes are skipped for them. In this case result verification must also be skipped. To solve these problems this change introduces a special flag to the Pass structure to mark passes that have valid results. If this flag is reset, verifications dependent on the pass result are skipped. Differential Revision: https://reviews.llvm.org/D27190 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@291882 91177308-0d34-0410-b5e6-96231b3b80d8
94 lines
3.3 KiB
C++
94 lines
3.3 KiB
C++
//===-- MachineFunctionPass.cpp -------------------------------------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file contains the definitions of the MachineFunctionPass members.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/CodeGen/MachineFunctionPass.h"
|
|
#include "llvm/Analysis/AliasAnalysis.h"
|
|
#include "llvm/Analysis/BasicAliasAnalysis.h"
|
|
#include "llvm/Analysis/DominanceFrontier.h"
|
|
#include "llvm/Analysis/GlobalsModRef.h"
|
|
#include "llvm/Analysis/IVUsers.h"
|
|
#include "llvm/Analysis/LoopInfo.h"
|
|
#include "llvm/Analysis/MemoryDependenceAnalysis.h"
|
|
#include "llvm/Analysis/ScalarEvolution.h"
|
|
#include "llvm/Analysis/ScalarEvolutionAliasAnalysis.h"
|
|
#include "llvm/CodeGen/MachineFunction.h"
|
|
#include "llvm/CodeGen/MachineModuleInfo.h"
|
|
#include "llvm/CodeGen/Passes.h"
|
|
#include "llvm/CodeGen/StackProtector.h"
|
|
#include "llvm/IR/Dominators.h"
|
|
#include "llvm/IR/Function.h"
|
|
|
|
using namespace llvm;
|
|
|
|
Pass *MachineFunctionPass::createPrinterPass(raw_ostream &O,
|
|
const std::string &Banner) const {
|
|
return createMachineFunctionPrinterPass(O, Banner);
|
|
}
|
|
|
|
bool MachineFunctionPass::runOnFunction(Function &F) {
|
|
// Do not codegen any 'available_externally' functions at all, they have
|
|
// definitions outside the translation unit.
|
|
if (F.hasAvailableExternallyLinkage()) {
|
|
setExecuted(false);
|
|
return false;
|
|
}
|
|
|
|
MachineModuleInfo &MMI = getAnalysis<MachineModuleInfo>();
|
|
MachineFunction &MF = MMI.getMachineFunction(F);
|
|
|
|
MachineFunctionProperties &MFProps = MF.getProperties();
|
|
|
|
#ifndef NDEBUG
|
|
if (!MFProps.verifyRequiredProperties(RequiredProperties)) {
|
|
errs() << "MachineFunctionProperties required by " << getPassName()
|
|
<< " pass are not met by function " << F.getName() << ".\n"
|
|
<< "Required properties: ";
|
|
RequiredProperties.print(errs());
|
|
errs() << "\nCurrent properties: ";
|
|
MFProps.print(errs());
|
|
errs() << "\n";
|
|
llvm_unreachable("MachineFunctionProperties check failed");
|
|
}
|
|
#endif
|
|
|
|
bool RV = runOnMachineFunction(MF);
|
|
|
|
MFProps.set(SetProperties);
|
|
MFProps.reset(ClearedProperties);
|
|
return RV;
|
|
}
|
|
|
|
void MachineFunctionPass::getAnalysisUsage(AnalysisUsage &AU) const {
|
|
AU.addRequired<MachineModuleInfo>();
|
|
AU.addPreserved<MachineModuleInfo>();
|
|
|
|
// MachineFunctionPass preserves all LLVM IR passes, but there's no
|
|
// high-level way to express this. Instead, just list a bunch of
|
|
// passes explicitly. This does not include setPreservesCFG,
|
|
// because CodeGen overloads that to mean preserving the MachineBasicBlock
|
|
// CFG in addition to the LLVM IR CFG.
|
|
AU.addPreserved<BasicAAWrapperPass>();
|
|
AU.addPreserved<DominanceFrontierWrapperPass>();
|
|
AU.addPreserved<DominatorTreeWrapperPass>();
|
|
AU.addPreserved<AAResultsWrapperPass>();
|
|
AU.addPreserved<GlobalsAAWrapperPass>();
|
|
AU.addPreserved<IVUsersWrapperPass>();
|
|
AU.addPreserved<LoopInfoWrapperPass>();
|
|
AU.addPreserved<MemoryDependenceWrapperPass>();
|
|
AU.addPreserved<ScalarEvolutionWrapperPass>();
|
|
AU.addPreserved<SCEVAAWrapperPass>();
|
|
AU.addPreserved<StackProtector>();
|
|
|
|
FunctionPass::getAnalysisUsage(AU);
|
|
}
|