forked from OSchip/llvm-project
Fix layering between SCCP and IPO SCCP
Transforms/Scalar/SCCP.cpp implemented both the Scalar and IPO SCCP, but this meant Transforms/Scalar including Transfroms/IPO headers, creating a circular dependency. (IPO depends on Scalar already) - so move the IPO SCCP shims out into IPO and the basic library implementation accessible from Scalar/SCCP.h to be used from the IPO/SCCP.cpp implementation. llvm-svn: 328250
This commit is contained in:
parent
2c2344e327
commit
3bbf5af0ac
|
@ -21,6 +21,10 @@
|
|||
#ifndef LLVM_TRANSFORMS_SCALAR_SCCP_H
|
||||
#define LLVM_TRANSFORMS_SCALAR_SCCP_H
|
||||
|
||||
#include "llvm/Analysis/TargetLibraryInfo.h"
|
||||
#include "llvm/IR/DataLayout.h"
|
||||
#include "llvm/IR/Function.h"
|
||||
#include "llvm/IR/Module.h"
|
||||
#include "llvm/IR/PassManager.h"
|
||||
|
||||
namespace llvm {
|
||||
|
@ -33,6 +37,7 @@ public:
|
|||
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
|
||||
};
|
||||
|
||||
bool runIPSCCP(Module &M, const DataLayout &DL, const TargetLibraryInfo *TLI);
|
||||
} // end namespace llvm
|
||||
|
||||
#endif // LLVM_TRANSFORMS_SCALAR_SCCP_H
|
||||
|
|
|
@ -29,6 +29,7 @@ add_llvm_library(LLVMipo
|
|||
PassManagerBuilder.cpp
|
||||
PruneEH.cpp
|
||||
SampleProfile.cpp
|
||||
SCCP.cpp
|
||||
StripDeadPrototypes.cpp
|
||||
StripSymbols.cpp
|
||||
SyntheticCountsPropagation.cpp
|
||||
|
|
|
@ -0,0 +1,58 @@
|
|||
#include "llvm/Transforms/IPO/SCCP.h"
|
||||
#include "llvm/Analysis/TargetLibraryInfo.h"
|
||||
#include "llvm/Transforms/IPO.h"
|
||||
#include "llvm/Transforms/Scalar/SCCP.h"
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
PreservedAnalyses IPSCCPPass::run(Module &M, ModuleAnalysisManager &AM) {
|
||||
const DataLayout &DL = M.getDataLayout();
|
||||
auto &TLI = AM.getResult<TargetLibraryAnalysis>(M);
|
||||
if (!runIPSCCP(M, DL, &TLI))
|
||||
return PreservedAnalyses::all();
|
||||
return PreservedAnalyses::none();
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
//
|
||||
/// IPSCCP Class - This class implements interprocedural Sparse Conditional
|
||||
/// Constant Propagation.
|
||||
///
|
||||
class IPSCCPLegacyPass : public ModulePass {
|
||||
public:
|
||||
static char ID;
|
||||
|
||||
IPSCCPLegacyPass() : ModulePass(ID) {
|
||||
initializeIPSCCPLegacyPassPass(*PassRegistry::getPassRegistry());
|
||||
}
|
||||
|
||||
bool runOnModule(Module &M) override {
|
||||
if (skipModule(M))
|
||||
return false;
|
||||
const DataLayout &DL = M.getDataLayout();
|
||||
const TargetLibraryInfo *TLI =
|
||||
&getAnalysis<TargetLibraryInfoWrapperPass>().getTLI();
|
||||
return runIPSCCP(M, DL, TLI);
|
||||
}
|
||||
|
||||
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
||||
AU.addRequired<TargetLibraryInfoWrapperPass>();
|
||||
}
|
||||
};
|
||||
|
||||
} // end anonymous namespace
|
||||
|
||||
char IPSCCPLegacyPass::ID = 0;
|
||||
|
||||
INITIALIZE_PASS_BEGIN(IPSCCPLegacyPass, "ipsccp",
|
||||
"Interprocedural Sparse Conditional Constant Propagation",
|
||||
false, false)
|
||||
INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass)
|
||||
INITIALIZE_PASS_END(IPSCCPLegacyPass, "ipsccp",
|
||||
"Interprocedural Sparse Conditional Constant Propagation",
|
||||
false, false)
|
||||
|
||||
// createIPSCCPPass - This is the public interface to this file.
|
||||
ModulePass *llvm::createIPSCCPPass() { return new IPSCCPLegacyPass(); }
|
|
@ -17,7 +17,7 @@
|
|||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm/Transforms/IPO/SCCP.h"
|
||||
#include "llvm/Transforms/Scalar/SCCP.h"
|
||||
#include "llvm/ADT/ArrayRef.h"
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/ADT/DenseSet.h"
|
||||
|
@ -54,9 +54,7 @@
|
|||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include "llvm/Transforms/IPO.h"
|
||||
#include "llvm/Transforms/Scalar.h"
|
||||
#include "llvm/Transforms/Scalar/SCCP.h"
|
||||
#include <cassert>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
@ -1858,8 +1856,8 @@ static void findReturnsToZap(Function &F,
|
|||
}
|
||||
}
|
||||
|
||||
static bool runIPSCCP(Module &M, const DataLayout &DL,
|
||||
const TargetLibraryInfo *TLI) {
|
||||
bool llvm::runIPSCCP(Module &M, const DataLayout &DL,
|
||||
const TargetLibraryInfo *TLI) {
|
||||
SCCPSolver Solver(DL, TLI);
|
||||
|
||||
// Loop over all functions, marking arguments to those with their addresses
|
||||
|
@ -2041,55 +2039,3 @@ static bool runIPSCCP(Module &M, const DataLayout &DL,
|
|||
|
||||
return MadeChanges;
|
||||
}
|
||||
|
||||
PreservedAnalyses IPSCCPPass::run(Module &M, ModuleAnalysisManager &AM) {
|
||||
const DataLayout &DL = M.getDataLayout();
|
||||
auto &TLI = AM.getResult<TargetLibraryAnalysis>(M);
|
||||
if (!runIPSCCP(M, DL, &TLI))
|
||||
return PreservedAnalyses::all();
|
||||
return PreservedAnalyses::none();
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
//
|
||||
/// IPSCCP Class - This class implements interprocedural Sparse Conditional
|
||||
/// Constant Propagation.
|
||||
///
|
||||
class IPSCCPLegacyPass : public ModulePass {
|
||||
public:
|
||||
static char ID;
|
||||
|
||||
IPSCCPLegacyPass() : ModulePass(ID) {
|
||||
initializeIPSCCPLegacyPassPass(*PassRegistry::getPassRegistry());
|
||||
}
|
||||
|
||||
bool runOnModule(Module &M) override {
|
||||
if (skipModule(M))
|
||||
return false;
|
||||
const DataLayout &DL = M.getDataLayout();
|
||||
const TargetLibraryInfo *TLI =
|
||||
&getAnalysis<TargetLibraryInfoWrapperPass>().getTLI();
|
||||
return runIPSCCP(M, DL, TLI);
|
||||
}
|
||||
|
||||
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
||||
AU.addRequired<TargetLibraryInfoWrapperPass>();
|
||||
}
|
||||
};
|
||||
|
||||
} // end anonymous namespace
|
||||
|
||||
char IPSCCPLegacyPass::ID = 0;
|
||||
|
||||
INITIALIZE_PASS_BEGIN(IPSCCPLegacyPass, "ipsccp",
|
||||
"Interprocedural Sparse Conditional Constant Propagation",
|
||||
false, false)
|
||||
INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass)
|
||||
INITIALIZE_PASS_END(IPSCCPLegacyPass, "ipsccp",
|
||||
"Interprocedural Sparse Conditional Constant Propagation",
|
||||
false, false)
|
||||
|
||||
// createIPSCCPPass - This is the public interface to this file.
|
||||
ModulePass *llvm::createIPSCCPPass() { return new IPSCCPLegacyPass(); }
|
||||
|
|
Loading…
Reference in New Issue