[llvm] r269937 - [PM] Port per-function SCCP to the new pass manager.

Davide Italiano via llvm-commits llvm-commits at lists.llvm.org
Sat May 28 17:49:08 PDT 2016


On Fri, May 27, 2016 at 2:35 PM, Davide Italiano <davide at freebsd.org> wrote:
> On Fri, May 27, 2016 at 2:21 PM, Justin Bogner <mail at justinbogner.com> wrote:
>> 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?
>>
>
> Hmm, probably. Should we do the same in Reassociate? It has a similar
> problem from what I can see (unless I misread the code).
>

r271149, r271159. I'll try to review all the other (already ported)
passes to spot any missing caching, if any.


-- 
Davide

"There are no solved problems; there are only problems that are more
or less solved" -- Henri Poincare


More information about the llvm-commits mailing list