[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