mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
5579dfa88e
This re-applies r336929 with a fix to accomodate for the Mips target scheduling multiple SelectionDAG instances into the pass pipeline. PrologEpilogInserter and StackColoring depend on the StackProtector analysis being alive from the point it is run until PEI, which requires that they are all scheduled in the same FunctionPassManager. Inserting a (machine) ModulePass between StackProtector and PEI results in these passes being in separate FunctionPassManagers and the StackProtector is not available for PEI. PEI and StackColoring don't use much information from the StackProtector pass, so transfering the required information to MachineFrameInfo is cleaner than keeping the StackProtector pass around. This commit moves the SSP layout information to MFI instead of keeping it in the pass. This patch set (D37580, D37581, D37582, D37583, D37584, D37585, D37586, D37587) is a first draft of the pagerando implementation described in http://lists.llvm.org/pipermail/llvm-dev/2017-June/113794.html. Patch by Stephen Crane <sjc@immunant.com> Differential Revision: https://reviews.llvm.org/D49256 llvm-svn: 336964
89 lines
3.3 KiB
C++
89 lines
3.3 KiB
C++
//===-- ResetMachineFunctionPass.cpp - Reset Machine Function ----*- C++ -*-==//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
/// \file
|
|
/// This file implements a pass that will conditionally reset a machine
|
|
/// function as if it was just created. This is used to provide a fallback
|
|
/// mechanism when GlobalISel fails, thus the condition for the reset to
|
|
/// happen is that the MachineFunction has the FailedISel property.
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/ADT/ScopeExit.h"
|
|
#include "llvm/ADT/Statistic.h"
|
|
#include "llvm/CodeGen/MachineFunction.h"
|
|
#include "llvm/CodeGen/MachineFunctionPass.h"
|
|
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
|
#include "llvm/CodeGen/StackProtector.h"
|
|
#include "llvm/CodeGen/Passes.h"
|
|
#include "llvm/IR/DiagnosticInfo.h"
|
|
#include "llvm/Support/Debug.h"
|
|
using namespace llvm;
|
|
|
|
#define DEBUG_TYPE "reset-machine-function"
|
|
|
|
STATISTIC(NumFunctionsReset, "Number of functions reset");
|
|
|
|
namespace {
|
|
class ResetMachineFunction : public MachineFunctionPass {
|
|
/// Tells whether or not this pass should emit a fallback
|
|
/// diagnostic when it resets a function.
|
|
bool EmitFallbackDiag;
|
|
/// Whether we should abort immediately instead of resetting the function.
|
|
bool AbortOnFailedISel;
|
|
|
|
public:
|
|
static char ID; // Pass identification, replacement for typeid
|
|
ResetMachineFunction(bool EmitFallbackDiag = false,
|
|
bool AbortOnFailedISel = false)
|
|
: MachineFunctionPass(ID), EmitFallbackDiag(EmitFallbackDiag),
|
|
AbortOnFailedISel(AbortOnFailedISel) {}
|
|
|
|
StringRef getPassName() const override { return "ResetMachineFunction"; }
|
|
|
|
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
|
AU.addPreserved<StackProtector>();
|
|
MachineFunctionPass::getAnalysisUsage(AU);
|
|
}
|
|
|
|
bool runOnMachineFunction(MachineFunction &MF) override {
|
|
// No matter what happened, whether we successfully selected the function
|
|
// or not, nothing is going to use the vreg types after us. Make sure they
|
|
// disappear.
|
|
auto ClearVRegTypesOnReturn =
|
|
make_scope_exit([&MF]() { MF.getRegInfo().clearVirtRegTypes(); });
|
|
|
|
if (MF.getProperties().hasProperty(
|
|
MachineFunctionProperties::Property::FailedISel)) {
|
|
if (AbortOnFailedISel)
|
|
report_fatal_error("Instruction selection failed");
|
|
LLVM_DEBUG(dbgs() << "Resetting: " << MF.getName() << '\n');
|
|
++NumFunctionsReset;
|
|
MF.reset();
|
|
if (EmitFallbackDiag) {
|
|
const Function &F = MF.getFunction();
|
|
DiagnosticInfoISelFallback DiagFallback(F);
|
|
F.getContext().diagnose(DiagFallback);
|
|
}
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
};
|
|
} // end anonymous namespace
|
|
|
|
char ResetMachineFunction::ID = 0;
|
|
INITIALIZE_PASS(ResetMachineFunction, DEBUG_TYPE,
|
|
"Reset machine function if ISel failed", false, false)
|
|
|
|
MachineFunctionPass *
|
|
llvm::createResetMachineFunctionPass(bool EmitFallbackDiag = false,
|
|
bool AbortOnFailedISel = false) {
|
|
return new ResetMachineFunction(EmitFallbackDiag, AbortOnFailedISel);
|
|
}
|