forked from OSchip/llvm-project
[PM] Port Interprocedural SCCP to the new pass manager.
llvm-svn: 268684
This commit is contained in:
parent
745f3cbcfc
commit
f54f2f0893
|
@ -146,7 +146,7 @@ void initializeGlobalDCELegacyPassPass(PassRegistry&);
|
||||||
void initializeGlobalOptLegacyPassPass(PassRegistry&);
|
void initializeGlobalOptLegacyPassPass(PassRegistry&);
|
||||||
void initializeGlobalsAAWrapperPassPass(PassRegistry&);
|
void initializeGlobalsAAWrapperPassPass(PassRegistry&);
|
||||||
void initializeIPCPPass(PassRegistry&);
|
void initializeIPCPPass(PassRegistry&);
|
||||||
void initializeIPSCCPPass(PassRegistry&);
|
void initializeIPSCCPLegacyPassPass(PassRegistry &);
|
||||||
void initializeIVUsersPass(PassRegistry&);
|
void initializeIVUsersPass(PassRegistry&);
|
||||||
void initializeIfConverterPass(PassRegistry&);
|
void initializeIfConverterPass(PassRegistry&);
|
||||||
void initializeInductiveRangeCheckEliminationPass(PassRegistry&);
|
void initializeInductiveRangeCheckEliminationPass(PassRegistry&);
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
//===- SCCP.h - Optimize Global Variables ----------------------*- C++ -*-===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is distributed under the University of Illinois Open Source
|
||||||
|
// License. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// This pass implements interprocedural sparse conditional constant
|
||||||
|
// propagation and merging.
|
||||||
|
//
|
||||||
|
// Specifically, this:
|
||||||
|
// * Assumes values are constant unless proven otherwise
|
||||||
|
// * Assumes BasicBlocks are dead unless proven otherwise
|
||||||
|
// * Proves values to be constant, and replaces them with constants
|
||||||
|
// * Proves conditional branches to be unconditional
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#ifndef LLVM_TRANSFORMS_IPO_SCCP_H
|
||||||
|
#define LLVM_TRANSFORMS_IPO_SCCP_H
|
||||||
|
|
||||||
|
#include "llvm/IR/Module.h"
|
||||||
|
#include "llvm/IR/PassManager.h"
|
||||||
|
|
||||||
|
namespace llvm {
|
||||||
|
/// Pass to perform interprocedural constant propagation.
|
||||||
|
class IPSCCPPass : public PassInfoMixin<IPSCCPPass> {
|
||||||
|
public:
|
||||||
|
PreservedAnalyses run(Module &M, AnalysisManager<Module> &AM);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#endif // LLVM_TRANSFORMS_IPO_SCCP_H
|
|
@ -97,7 +97,7 @@ void LTOCodeGenerator::initializeLTOPasses() {
|
||||||
PassRegistry &R = *PassRegistry::getPassRegistry();
|
PassRegistry &R = *PassRegistry::getPassRegistry();
|
||||||
|
|
||||||
initializeInternalizeLegacyPassPass(R);
|
initializeInternalizeLegacyPassPass(R);
|
||||||
initializeIPSCCPPass(R);
|
initializeIPSCCPLegacyPassPass(R);
|
||||||
initializeGlobalOptLegacyPassPass(R);
|
initializeGlobalOptLegacyPassPass(R);
|
||||||
initializeConstantMergeLegacyPassPass(R);
|
initializeConstantMergeLegacyPassPass(R);
|
||||||
initializeDAHPass(R);
|
initializeDAHPass(R);
|
||||||
|
|
|
@ -54,6 +54,7 @@
|
||||||
#include "llvm/Transforms/IPO/GlobalOpt.h"
|
#include "llvm/Transforms/IPO/GlobalOpt.h"
|
||||||
#include "llvm/Transforms/IPO/InferFunctionAttrs.h"
|
#include "llvm/Transforms/IPO/InferFunctionAttrs.h"
|
||||||
#include "llvm/Transforms/IPO/Internalize.h"
|
#include "llvm/Transforms/IPO/Internalize.h"
|
||||||
|
#include "llvm/Transforms/IPO/SCCP.h"
|
||||||
#include "llvm/Transforms/IPO/StripDeadPrototypes.h"
|
#include "llvm/Transforms/IPO/StripDeadPrototypes.h"
|
||||||
#include "llvm/Transforms/InstCombine/InstCombine.h"
|
#include "llvm/Transforms/InstCombine/InstCombine.h"
|
||||||
#include "llvm/Transforms/InstrProfiling.h"
|
#include "llvm/Transforms/InstrProfiling.h"
|
||||||
|
|
|
@ -44,6 +44,7 @@ MODULE_PASS("inferattrs", InferFunctionAttrsPass())
|
||||||
MODULE_PASS("internalize", InternalizePass())
|
MODULE_PASS("internalize", InternalizePass())
|
||||||
MODULE_PASS("instrprof", InstrProfiling())
|
MODULE_PASS("instrprof", InstrProfiling())
|
||||||
MODULE_PASS("invalidate<all>", InvalidateAllAnalysesPass())
|
MODULE_PASS("invalidate<all>", InvalidateAllAnalysesPass())
|
||||||
|
MODULE_PASS("ipsccp", IPSCCPPass())
|
||||||
MODULE_PASS("no-op-module", NoOpModulePass())
|
MODULE_PASS("no-op-module", NoOpModulePass())
|
||||||
MODULE_PASS("print", PrintModulePass(dbgs()))
|
MODULE_PASS("print", PrintModulePass(dbgs()))
|
||||||
MODULE_PASS("print-callgraph", CallGraphPrinterPass(dbgs()))
|
MODULE_PASS("print-callgraph", CallGraphPrinterPass(dbgs()))
|
||||||
|
|
|
@ -17,15 +17,15 @@
|
||||||
//
|
//
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
#include "llvm/Transforms/Scalar.h"
|
#include "llvm/Transforms/IPO/SCCP.h"
|
||||||
#include "llvm/ADT/DenseMap.h"
|
#include "llvm/ADT/DenseMap.h"
|
||||||
#include "llvm/ADT/DenseSet.h"
|
#include "llvm/ADT/DenseSet.h"
|
||||||
#include "llvm/ADT/PointerIntPair.h"
|
#include "llvm/ADT/PointerIntPair.h"
|
||||||
#include "llvm/ADT/SmallPtrSet.h"
|
#include "llvm/ADT/SmallPtrSet.h"
|
||||||
#include "llvm/ADT/SmallVector.h"
|
#include "llvm/ADT/SmallVector.h"
|
||||||
#include "llvm/ADT/Statistic.h"
|
#include "llvm/ADT/Statistic.h"
|
||||||
#include "llvm/Analysis/GlobalsModRef.h"
|
|
||||||
#include "llvm/Analysis/ConstantFolding.h"
|
#include "llvm/Analysis/ConstantFolding.h"
|
||||||
|
#include "llvm/Analysis/GlobalsModRef.h"
|
||||||
#include "llvm/Analysis/TargetLibraryInfo.h"
|
#include "llvm/Analysis/TargetLibraryInfo.h"
|
||||||
#include "llvm/IR/CallSite.h"
|
#include "llvm/IR/CallSite.h"
|
||||||
#include "llvm/IR/Constants.h"
|
#include "llvm/IR/Constants.h"
|
||||||
|
@ -38,6 +38,7 @@
|
||||||
#include "llvm/Support/ErrorHandling.h"
|
#include "llvm/Support/ErrorHandling.h"
|
||||||
#include "llvm/Support/raw_ostream.h"
|
#include "llvm/Support/raw_ostream.h"
|
||||||
#include "llvm/Transforms/IPO.h"
|
#include "llvm/Transforms/IPO.h"
|
||||||
|
#include "llvm/Transforms/Scalar.h"
|
||||||
#include "llvm/Transforms/Utils/Local.h"
|
#include "llvm/Transforms/Utils/Local.h"
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
@ -1644,39 +1645,6 @@ bool SCCP::runOnFunction(Function &F) {
|
||||||
return MadeChanges;
|
return MadeChanges;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace {
|
|
||||||
//===--------------------------------------------------------------------===//
|
|
||||||
//
|
|
||||||
/// IPSCCP Class - This class implements interprocedural Sparse Conditional
|
|
||||||
/// Constant Propagation.
|
|
||||||
///
|
|
||||||
struct IPSCCP : public ModulePass {
|
|
||||||
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
|
||||||
AU.addRequired<TargetLibraryInfoWrapperPass>();
|
|
||||||
}
|
|
||||||
static char ID;
|
|
||||||
IPSCCP() : ModulePass(ID) {
|
|
||||||
initializeIPSCCPPass(*PassRegistry::getPassRegistry());
|
|
||||||
}
|
|
||||||
bool runOnModule(Module &M) override;
|
|
||||||
};
|
|
||||||
} // end anonymous namespace
|
|
||||||
|
|
||||||
char IPSCCP::ID = 0;
|
|
||||||
INITIALIZE_PASS_BEGIN(IPSCCP, "ipsccp",
|
|
||||||
"Interprocedural Sparse Conditional Constant Propagation",
|
|
||||||
false, false)
|
|
||||||
INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass)
|
|
||||||
INITIALIZE_PASS_END(IPSCCP, "ipsccp",
|
|
||||||
"Interprocedural Sparse Conditional Constant Propagation",
|
|
||||||
false, false)
|
|
||||||
|
|
||||||
// createIPSCCPPass - This is the public interface to this file.
|
|
||||||
ModulePass *llvm::createIPSCCPPass() {
|
|
||||||
return new IPSCCP();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static bool AddressIsTaken(const GlobalValue *GV) {
|
static bool AddressIsTaken(const GlobalValue *GV) {
|
||||||
// Delete any dead constantexpr klingons.
|
// Delete any dead constantexpr klingons.
|
||||||
GV->removeDeadConstantUsers();
|
GV->removeDeadConstantUsers();
|
||||||
|
@ -1704,13 +1672,8 @@ static bool AddressIsTaken(const GlobalValue *GV) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IPSCCP::runOnModule(Module &M) {
|
static bool runIPSCCP(Module &M, const DataLayout &DL,
|
||||||
if (skipModule(M))
|
const TargetLibraryInfo *TLI) {
|
||||||
return false;
|
|
||||||
|
|
||||||
const DataLayout &DL = M.getDataLayout();
|
|
||||||
const TargetLibraryInfo *TLI =
|
|
||||||
&getAnalysis<TargetLibraryInfoWrapperPass>().getTLI();
|
|
||||||
SCCPSolver Solver(DL, TLI);
|
SCCPSolver Solver(DL, TLI);
|
||||||
|
|
||||||
// AddressTakenFunctions - This set keeps track of the address-taken functions
|
// AddressTakenFunctions - This set keeps track of the address-taken functions
|
||||||
|
@ -1955,3 +1918,51 @@ bool IPSCCP::runOnModule(Module &M) {
|
||||||
|
|
||||||
return MadeChanges;
|
return MadeChanges;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PreservedAnalyses IPSCCPPass::run(Module &M, AnalysisManager<Module> &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.
|
||||||
|
///
|
||||||
|
struct IPSCCPLegacyPass : public ModulePass {
|
||||||
|
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(); }
|
||||||
|
|
|
@ -71,7 +71,7 @@ void llvm::initializeScalarOpts(PassRegistry &Registry) {
|
||||||
initializeRegToMemPass(Registry);
|
initializeRegToMemPass(Registry);
|
||||||
initializeRewriteStatepointsForGCPass(Registry);
|
initializeRewriteStatepointsForGCPass(Registry);
|
||||||
initializeSCCPPass(Registry);
|
initializeSCCPPass(Registry);
|
||||||
initializeIPSCCPPass(Registry);
|
initializeIPSCCPLegacyPassPass(Registry);
|
||||||
initializeSROALegacyPassPass(Registry);
|
initializeSROALegacyPassPass(Registry);
|
||||||
initializeSROA_DTPass(Registry);
|
initializeSROA_DTPass(Registry);
|
||||||
initializeSROA_SSAUpPass(Registry);
|
initializeSROA_SSAUpPass(Registry);
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
; RUN: opt < %s -S -passes=ipsccp | FileCheck %s
|
||||||
; RUN: opt < %s -S -ipsccp | FileCheck %s
|
; RUN: opt < %s -S -ipsccp | FileCheck %s
|
||||||
|
|
||||||
@_ZL6test1g = internal global i32 42, align 4
|
@_ZL6test1g = internal global i32 42, align 4
|
||||||
|
|
Loading…
Reference in New Issue