[PATCH] Port ADCE to the new pass manager

Justin Bogner via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 5 13:59:34 PDT 2015


ping.

Justin Bogner <mail at justinbogner.com> writes:
> The attached patch ports ADCE to the new pass manager. It's basically
> mechanical and based off of some of the ports you've already done so
> it's probably good to go in, but I have a couple of questions about
> parts that seemed a little odd.
>
> 1. The legacy pass states it preserves GlobalsAAWrapperPass, but the new
>    pass returns PreservedAnalyses::none when it does work. This seems
>    inconsistent, but maybe I'm missing something.
>
> 2. Similarly, some of the other passes you've ported do
>    AU.setPreservesCFG(), but this doesn't seem to be reflected in the
>    new passes. How's this going to work?
>
> 3. As per my reply to "Port SimplifyCFG to the new pass manager", it
>    seems like we don't have good testing infrastructure in terms of
>    preserved analyses. Do you have any ideas for how we're going to deal
>    with that?
>
> Anyway, let me know if this is good to land. I might tackle a couple
> more of these in the near future, and some clarity on the above
> questions would help.
>
> commit cef9c843c206159c77d5ccccd2dba3914daa4452
> Author: Justin Bogner <mail at justinbogner.com>
> Date:   Fri Sep 25 15:35:25 2015 -0700
>
>     [PM] Port ADCE to the new pass manager
>
> diff --git a/include/llvm/InitializePasses.h b/include/llvm/InitializePasses.h
> index 75f9857..f888c97 100644
> --- a/include/llvm/InitializePasses.h
> +++ b/include/llvm/InitializePasses.h
> @@ -61,7 +61,7 @@ void initializeTarget(PassRegistry&);
>  
>  void initializeAAEvalPass(PassRegistry&);
>  void initializeAddDiscriminatorsPass(PassRegistry&);
> -void initializeADCEPass(PassRegistry&);
> +void initializeADCELegacyPassPass(PassRegistry&);
>  void initializeBDCEPass(PassRegistry&);
>  void initializeAliasSetPrinterPass(PassRegistry&);
>  void initializeAlwaysInlinerPass(PassRegistry&);
> diff --git a/include/llvm/Transforms/Scalar/ADCE.h b/include/llvm/Transforms/Scalar/ADCE.h
> new file mode 100644
> index 0000000..f9bc7b7
> --- /dev/null
> +++ b/include/llvm/Transforms/Scalar/ADCE.h
> @@ -0,0 +1,38 @@
> +//===- ADCE.h - Aggressive dead code elimination --------------------------===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +//
> +// This file provides the interface for the Aggressive Dead Code Elimination
> +// pass. This pass optimistically assumes that all instructions are dead until
> +// proven otherwise, allowing it to eliminate dead computations that other DCE
> +// passes do not catch, particularly involving loop computations.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +#ifndef LLVM_TRANSFORMS_SCALAR_ADCE_H
> +#define LLVM_TRANSFORMS_SCALAR_ADCE_H
> +
> +#include "llvm/IR/Function.h"
> +#include "llvm/IR/PassManager.h"
> +
> +namespace llvm {
> +
> +/// A DCE pass that assumes instructions are dead until proven otherwise.
> +///
> +/// This pass eliminates dead code by optimistically assuming that all
> +/// instructions are dead until proven otherwise. This allows it to eliminate
> +/// dead computations that other DCE passes do not catch, particularly involving
> +/// loop computations.
> +class ADCEPass {
> +public:
> +  static StringRef name() { return "ADCEPass"; }
> +  PreservedAnalyses run(Function &F);
> +};
> +}
> +
> +#endif // LLVM_TRANSFORMS_SCALAR_ADCE_H
> diff --git a/lib/Passes/PassBuilder.cpp b/lib/Passes/PassBuilder.cpp
> index b8f6e20..f18fcb1 100644
> --- a/lib/Passes/PassBuilder.cpp
> +++ b/lib/Passes/PassBuilder.cpp
> @@ -30,6 +30,7 @@
>  #include "llvm/Support/Debug.h"
>  #include "llvm/Target/TargetMachine.h"
>  #include "llvm/Transforms/InstCombine/InstCombine.h"
> +#include "llvm/Transforms/Scalar/ADCE.h"
>  #include "llvm/Transforms/Scalar/EarlyCSE.h"
>  #include "llvm/Transforms/Scalar/LowerExpectIntrinsic.h"
>  #include "llvm/Transforms/Scalar/SimplifyCFG.h"
> diff --git a/lib/Passes/PassRegistry.def b/lib/Passes/PassRegistry.def
> index da4e63b..6f52330 100644
> --- a/lib/Passes/PassRegistry.def
> +++ b/lib/Passes/PassRegistry.def
> @@ -63,6 +63,7 @@ FUNCTION_ANALYSIS("targetir",
>  #ifndef FUNCTION_PASS
>  #define FUNCTION_PASS(NAME, CREATE_PASS)
>  #endif
> +FUNCTION_PASS("adce", ADCEPass())
>  FUNCTION_PASS("early-cse", EarlyCSEPass())
>  FUNCTION_PASS("instcombine", InstCombinePass())
>  FUNCTION_PASS("invalidate<all>", InvalidateAllAnalysesPass())
> diff --git a/lib/Transforms/Scalar/ADCE.cpp b/lib/Transforms/Scalar/ADCE.cpp
> index c73766c..590a52d 100644
> --- a/lib/Transforms/Scalar/ADCE.cpp
> +++ b/lib/Transforms/Scalar/ADCE.cpp
> @@ -14,7 +14,7 @@
>  //
>  //===----------------------------------------------------------------------===//
>  
> -#include "llvm/Transforms/Scalar.h"
> +#include "llvm/Transforms/Scalar/ADCE.h"
>  #include "llvm/ADT/DepthFirstIterator.h"
>  #include "llvm/ADT/SmallPtrSet.h"
>  #include "llvm/ADT/SmallVector.h"
> @@ -26,35 +26,14 @@
>  #include "llvm/IR/Instructions.h"
>  #include "llvm/IR/IntrinsicInst.h"
>  #include "llvm/Pass.h"
> +#include "llvm/Transforms/Scalar.h"
>  using namespace llvm;
>  
>  #define DEBUG_TYPE "adce"
>  
>  STATISTIC(NumRemoved, "Number of instructions removed");
>  
> -namespace {
> -struct ADCE : public FunctionPass {
> -  static char ID; // Pass identification, replacement for typeid
> -  ADCE() : FunctionPass(ID) {
> -    initializeADCEPass(*PassRegistry::getPassRegistry());
> -  }
> -
> -  bool runOnFunction(Function& F) override;
> -
> -  void getAnalysisUsage(AnalysisUsage& AU) const override {
> -    AU.setPreservesCFG();
> -    AU.addPreserved<GlobalsAAWrapperPass>();
> -  }
> -};
> -}
> -
> -char ADCE::ID = 0;
> -INITIALIZE_PASS(ADCE, "adce", "Aggressive Dead Code Elimination", false, false)
> -
> -bool ADCE::runOnFunction(Function& F) {
> -  if (skipOptnoneFunction(F))
> -    return false;
> -
> +static bool aggressiveDCE(Function& F) {
>    SmallPtrSet<Instruction*, 128> Alive;
>    SmallVector<Instruction*, 128> Worklist;
>  
> @@ -96,6 +75,34 @@ bool ADCE::runOnFunction(Function& F) {
>    return !Worklist.empty();
>  }
>  
> -FunctionPass *llvm::createAggressiveDCEPass() {
> -  return new ADCE();
> +PreservedAnalyses ADCEPass::run(Function &F) {
> +  if (aggressiveDCE(F))
> +    return PreservedAnalyses::none();
> +  return PreservedAnalyses::all();
>  }
> +
> +namespace {
> +struct ADCELegacyPass : public FunctionPass {
> +  static char ID; // Pass identification, replacement for typeid
> +  ADCELegacyPass() : FunctionPass(ID) {
> +    initializeADCELegacyPassPass(*PassRegistry::getPassRegistry());
> +  }
> +
> +  bool runOnFunction(Function& F) override {
> +    if (skipOptnoneFunction(F))
> +      return false;
> +    return aggressiveDCE(F);
> +  }
> +
> +  void getAnalysisUsage(AnalysisUsage& AU) const override {
> +    AU.setPreservesCFG();
> +    AU.addPreserved<GlobalsAAWrapperPass>();
> +  }
> +};
> +}
> +
> +char ADCELegacyPass::ID = 0;
> +INITIALIZE_PASS(ADCELegacyPass, "adce", "Aggressive Dead Code Elimination",
> +                false, false)
> +
> +FunctionPass *llvm::createAggressiveDCEPass() { return new ADCELegacyPass(); }
> diff --git a/lib/Transforms/Scalar/Scalar.cpp b/lib/Transforms/Scalar/Scalar.cpp
> index f7a6134..fd74fa8 100644
> --- a/lib/Transforms/Scalar/Scalar.cpp
> +++ b/lib/Transforms/Scalar/Scalar.cpp
> @@ -30,7 +30,7 @@ using namespace llvm;
>  /// initializeScalarOptsPasses - Initialize all passes linked into the
>  /// ScalarOpts library.
>  void llvm::initializeScalarOpts(PassRegistry &Registry) {
> -  initializeADCEPass(Registry);
> +  initializeADCELegacyPassPass(Registry);
>    initializeBDCEPass(Registry);
>    initializeAlignmentFromAssumptionsPass(Registry);
>    initializeConstantHoistingPass(Registry);
> diff --git a/test/Transforms/ADCE/basictest.ll b/test/Transforms/ADCE/basictest.ll
> index 61c4224..aaacc18 100644
> --- a/test/Transforms/ADCE/basictest.ll
> +++ b/test/Transforms/ADCE/basictest.ll
> @@ -1,4 +1,5 @@
>  ; RUN: opt < %s -adce -simplifycfg | llvm-dis
> +; RUN: opt < %s -passes=adce | llvm-dis
>  
>  define i32 @Test(i32 %A, i32 %B) {
>  BB1:


More information about the llvm-commits mailing list