forked from OSchip/llvm-project
[PM] Port per-function SCCP to the new pass manager.
llvm-svn: 269937
This commit is contained in:
parent
da5b1131de
commit
98f7e0e790
|
@ -267,7 +267,7 @@ void initializeRegionViewerPass(PassRegistry&);
|
|||
void initializeReversePostOrderFunctionAttrsPass(PassRegistry&);
|
||||
void initializeRewriteStatepointsForGCPass(PassRegistry&);
|
||||
void initializeSafeStackPass(PassRegistry&);
|
||||
void initializeSCCPPass(PassRegistry&);
|
||||
void initializeSCCPLegacyPassPass(PassRegistry &);
|
||||
void initializeSROALegacyPassPass(PassRegistry&);
|
||||
void initializeSROA_DTPass(PassRegistry&);
|
||||
void initializeSROA_SSAUpPass(PassRegistry&);
|
||||
|
|
|
@ -0,0 +1,35 @@
|
|||
//===- SCCP.cpp - Sparse Conditional Constant Propagation -------*- 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 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_SCALAR_SCCP_H
|
||||
#define LLVM_TRANSFORMS_SCALAR_SCCP_H
|
||||
|
||||
#include "llvm/IR/Function.h"
|
||||
#include "llvm/IR/PassManager.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
/// This pass performs function-level constant propagation and merging.
|
||||
struct SCCPPass : PassInfoMixin<SCCPPass> {
|
||||
PreservedAnalyses run(Function &F, AnalysisManager<Function> &AM);
|
||||
};
|
||||
}
|
||||
|
||||
#endif // LLVM_TRANSFORMS_SCALAR_SCCP_H
|
|
@ -72,6 +72,7 @@
|
|||
#include "llvm/Transforms/Scalar/LowerAtomic.h"
|
||||
#include "llvm/Transforms/Scalar/LowerExpectIntrinsic.h"
|
||||
#include "llvm/Transforms/Scalar/Reassociate.h"
|
||||
#include "llvm/Transforms/Scalar/SCCP.h"
|
||||
#include "llvm/Transforms/Scalar/SROA.h"
|
||||
#include "llvm/Transforms/Scalar/SimplifyCFG.h"
|
||||
#include "llvm/Transforms/Scalar/Sink.h"
|
||||
|
|
|
@ -131,6 +131,7 @@ FUNCTION_PASS("print<loops>", LoopPrinterPass(dbgs()))
|
|||
FUNCTION_PASS("print<regions>", RegionInfoPrinterPass(dbgs()))
|
||||
FUNCTION_PASS("print<scalar-evolution>", ScalarEvolutionPrinterPass(dbgs()))
|
||||
FUNCTION_PASS("reassociate", ReassociatePass())
|
||||
FUNCTION_PASS("sccp", SCCPPass())
|
||||
FUNCTION_PASS("simplify-cfg", SimplifyCFGPass())
|
||||
FUNCTION_PASS("sink", SinkingPass())
|
||||
FUNCTION_PASS("sroa", SROA())
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
#include "llvm/Support/raw_ostream.h"
|
||||
#include "llvm/Transforms/IPO.h"
|
||||
#include "llvm/Transforms/Scalar.h"
|
||||
#include "llvm/Transforms/Scalar/SCCP.h"
|
||||
#include "llvm/Transforms/Utils/Local.h"
|
||||
#include <algorithm>
|
||||
using namespace llvm;
|
||||
|
@ -1548,53 +1549,12 @@ bool SCCPSolver::ResolvedUndefsIn(Function &F) {
|
|||
return false;
|
||||
}
|
||||
|
||||
|
||||
namespace {
|
||||
//===--------------------------------------------------------------------===//
|
||||
//
|
||||
/// SCCP Class - This class uses the SCCPSolver to implement a per-function
|
||||
/// Sparse Conditional Constant Propagator.
|
||||
///
|
||||
struct SCCP : public FunctionPass {
|
||||
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
||||
AU.addRequired<TargetLibraryInfoWrapperPass>();
|
||||
AU.addPreserved<GlobalsAAWrapperPass>();
|
||||
}
|
||||
static char ID; // Pass identification, replacement for typeid
|
||||
SCCP() : FunctionPass(ID) {
|
||||
initializeSCCPPass(*PassRegistry::getPassRegistry());
|
||||
}
|
||||
|
||||
// runOnFunction - Run the Sparse Conditional Constant Propagation
|
||||
// algorithm, and return true if the function was modified.
|
||||
//
|
||||
bool runOnFunction(Function &F) override;
|
||||
};
|
||||
} // end anonymous namespace
|
||||
|
||||
char SCCP::ID = 0;
|
||||
INITIALIZE_PASS_BEGIN(SCCP, "sccp",
|
||||
"Sparse Conditional Constant Propagation", false, false)
|
||||
INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass)
|
||||
INITIALIZE_PASS_END(SCCP, "sccp",
|
||||
"Sparse Conditional Constant Propagation", false, false)
|
||||
|
||||
// createSCCPPass - This is the public interface to this file.
|
||||
FunctionPass *llvm::createSCCPPass() {
|
||||
return new SCCP();
|
||||
}
|
||||
|
||||
// runOnFunction() - Run the Sparse Conditional Constant Propagation algorithm,
|
||||
// runSCCP() - Run the Sparse Conditional Constant Propagation algorithm,
|
||||
// and return true if the function was modified.
|
||||
//
|
||||
bool SCCP::runOnFunction(Function &F) {
|
||||
if (skipFunction(F))
|
||||
return false;
|
||||
|
||||
static bool runSCCP(Function &F, const DataLayout &DL,
|
||||
const TargetLibraryInfo *TLI) {
|
||||
DEBUG(dbgs() << "SCCP on function '" << F.getName() << "'\n");
|
||||
const DataLayout &DL = F.getParent()->getDataLayout();
|
||||
const TargetLibraryInfo *TLI =
|
||||
&getAnalysis<TargetLibraryInfoWrapperPass>().getTLI();
|
||||
SCCPSolver Solver(DL, TLI);
|
||||
|
||||
// Mark the first block of the function as being executable.
|
||||
|
@ -1664,6 +1624,54 @@ bool SCCP::runOnFunction(Function &F) {
|
|||
return MadeChanges;
|
||||
}
|
||||
|
||||
PreservedAnalyses SCCPPass::run(Function &F, AnalysisManager<Function> &AM) {
|
||||
const DataLayout &DL = F.getParent()->getDataLayout();
|
||||
auto &TLI = AM.getResult<TargetLibraryAnalysis>(F);
|
||||
if (!runSCCP(F, DL, &TLI))
|
||||
return PreservedAnalyses::all();
|
||||
return PreservedAnalyses::none();
|
||||
}
|
||||
|
||||
namespace {
|
||||
//===--------------------------------------------------------------------===//
|
||||
//
|
||||
/// SCCP Class - This class uses the SCCPSolver to implement a per-function
|
||||
/// Sparse Conditional Constant Propagator.
|
||||
///
|
||||
struct SCCPLegacyPass : public FunctionPass {
|
||||
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
||||
AU.addRequired<TargetLibraryInfoWrapperPass>();
|
||||
AU.addPreserved<GlobalsAAWrapperPass>();
|
||||
}
|
||||
static char ID; // Pass identification, replacement for typeid
|
||||
SCCPLegacyPass() : FunctionPass(ID) {
|
||||
initializeSCCPLegacyPassPass(*PassRegistry::getPassRegistry());
|
||||
}
|
||||
|
||||
// runOnFunction - Run the Sparse Conditional Constant Propagation
|
||||
// algorithm, and return true if the function was modified.
|
||||
//
|
||||
bool runOnFunction(Function &F) override {
|
||||
if (skipFunction(F))
|
||||
return false;
|
||||
const DataLayout &DL = F.getParent()->getDataLayout();
|
||||
const TargetLibraryInfo *TLI =
|
||||
&getAnalysis<TargetLibraryInfoWrapperPass>().getTLI();
|
||||
return runSCCP(F, DL, TLI);
|
||||
}
|
||||
};
|
||||
} // end anonymous namespace
|
||||
|
||||
char SCCPLegacyPass::ID = 0;
|
||||
INITIALIZE_PASS_BEGIN(SCCPLegacyPass, "sccp",
|
||||
"Sparse Conditional Constant Propagation", false, false)
|
||||
INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass)
|
||||
INITIALIZE_PASS_END(SCCPLegacyPass, "sccp",
|
||||
"Sparse Conditional Constant Propagation", false, false)
|
||||
|
||||
// createSCCPPass - This is the public interface to this file.
|
||||
FunctionPass *llvm::createSCCPPass() { return new SCCPLegacyPass(); }
|
||||
|
||||
static bool AddressIsTaken(const GlobalValue *GV) {
|
||||
// Delete any dead constantexpr klingons.
|
||||
GV->removeDeadConstantUsers();
|
||||
|
|
|
@ -70,7 +70,7 @@ void llvm::initializeScalarOpts(PassRegistry &Registry) {
|
|||
initializeReassociateLegacyPassPass(Registry);
|
||||
initializeRegToMemPass(Registry);
|
||||
initializeRewriteStatepointsForGCPass(Registry);
|
||||
initializeSCCPPass(Registry);
|
||||
initializeSCCPLegacyPassPass(Registry);
|
||||
initializeIPSCCPLegacyPassPass(Registry);
|
||||
initializeSROALegacyPassPass(Registry);
|
||||
initializeSROA_DTPass(Registry);
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
; RUN: opt < %s -sccp -S | FileCheck %s
|
||||
; RUN: opt < %s -passes=sccp -S | FileCheck %s
|
||||
|
||||
@0 = private unnamed_addr constant [2 x i32] [i32 -1, i32 1]
|
||||
@"\01??_7A@@6B@" = unnamed_addr alias i32, getelementptr inbounds ([2 x i32], [2 x i32]* @0, i32 0, i32 1)
|
||||
|
|
Loading…
Reference in New Issue