[llvm] r269937 - [PM] Port per-function SCCP to the new pass manager.
Justin Bogner via llvm-commits
llvm-commits at lists.llvm.org
Fri May 27 14:21:08 PDT 2016
Davide Italiano via llvm-commits <llvm-commits at lists.llvm.org> writes:
> Author: davide
> Date: Wed May 18 10:18:25 2016
> New Revision: 269937
>
> URL: http://llvm.org/viewvc/llvm-project?rev=269937&view=rev
> Log:
> [PM] Port per-function SCCP to the new pass manager.
>
> Added:
> llvm/trunk/include/llvm/Transforms/Scalar/SCCP.h
> Modified:
> llvm/trunk/include/llvm/InitializePasses.h
> llvm/trunk/lib/Passes/PassBuilder.cpp
> llvm/trunk/lib/Passes/PassRegistry.def
> llvm/trunk/lib/Transforms/Scalar/SCCP.cpp
> llvm/trunk/lib/Transforms/Scalar/Scalar.cpp
> llvm/trunk/test/Transforms/SCCP/global-alias-constprop.ll
>
> Modified: llvm/trunk/include/llvm/InitializePasses.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/InitializePasses.h?rev=269937&r1=269936&r2=269937&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/InitializePasses.h (original)
> +++ llvm/trunk/include/llvm/InitializePasses.h Wed May 18 10:18:25 2016
> @@ -267,7 +267,7 @@ void initializeRegionViewerPass(PassRegi
> 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&);
>
> Added: llvm/trunk/include/llvm/Transforms/Scalar/SCCP.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Scalar/SCCP.h?rev=269937&view=auto
> ==============================================================================
> --- llvm/trunk/include/llvm/Transforms/Scalar/SCCP.h (added)
> +++ llvm/trunk/include/llvm/Transforms/Scalar/SCCP.h Wed May 18 10:18:25 2016
> @@ -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
>
> Modified: llvm/trunk/lib/Passes/PassBuilder.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Passes/PassBuilder.cpp?rev=269937&r1=269936&r2=269937&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Passes/PassBuilder.cpp (original)
> +++ llvm/trunk/lib/Passes/PassBuilder.cpp Wed May 18 10:18:25 2016
> @@ -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"
>
> Modified: llvm/trunk/lib/Passes/PassRegistry.def
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Passes/PassRegistry.def?rev=269937&r1=269936&r2=269937&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Passes/PassRegistry.def (original)
> +++ llvm/trunk/lib/Passes/PassRegistry.def Wed May 18 10:18:25 2016
> @@ -131,6 +131,7 @@ FUNCTION_PASS("print<loops>", LoopPrinte
> 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())
>
> Modified: llvm/trunk/lib/Transforms/Scalar/SCCP.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/SCCP.cpp?rev=269937&r1=269936&r2=269937&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Scalar/SCCP.cpp (original)
> +++ llvm/trunk/lib/Transforms/Scalar/SCCP.cpp Wed May 18 10:18:25 2016
> @@ -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(Functi
> 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();
Should this preserve GlobalsAA like the legacy pass does?
> +}
> +
> +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();
>
> Modified: llvm/trunk/lib/Transforms/Scalar/Scalar.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/Scalar.cpp?rev=269937&r1=269936&r2=269937&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Scalar/Scalar.cpp (original)
> +++ llvm/trunk/lib/Transforms/Scalar/Scalar.cpp Wed May 18 10:18:25 2016
> @@ -70,7 +70,7 @@ void llvm::initializeScalarOpts(PassRegi
> initializeReassociateLegacyPassPass(Registry);
> initializeRegToMemPass(Registry);
> initializeRewriteStatepointsForGCPass(Registry);
> - initializeSCCPPass(Registry);
> + initializeSCCPLegacyPassPass(Registry);
> initializeIPSCCPLegacyPassPass(Registry);
> initializeSROALegacyPassPass(Registry);
> initializeSROA_DTPass(Registry);
>
> Modified: llvm/trunk/test/Transforms/SCCP/global-alias-constprop.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/SCCP/global-alias-constprop.ll?rev=269937&r1=269936&r2=269937&view=diff
> ==============================================================================
> --- llvm/trunk/test/Transforms/SCCP/global-alias-constprop.ll (original)
> +++ llvm/trunk/test/Transforms/SCCP/global-alias-constprop.ll Wed May 18 10:18:25 2016
> @@ -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)
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list