[PATCH] Port ADCE to the new pass manager

Justin Bogner via llvm-commits llvm-commits at lists.llvm.org
Fri Oct 30 16:17:06 PDT 2015


Chandler Carruth <chandlerc at google.com> writes:
> LGTM

Thanks! r251725.

>
> On Mon, Oct 5, 2015 at 1:59 PM Justin Bogner <mail at justinbogner.com> wrote:
>
>> 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