[PATCH] D19782: [IPO/GlobalDCE] Convert the pass to use static functions.

Justin Bogner via llvm-commits llvm-commits at lists.llvm.org
Mon May 2 14:12:06 PDT 2016


Davide Italiano <dccitaliano at gmail.com> writes:
> davide updated this revision to Diff 55842.
> davide added a comment.
> Herald added a subscriber: joker.eph.
>
> Update after Justin's feedback.

A few remaining nits, and make sure to update the title / commit message
since it's no longer accurate. This LGTM but I suppose we should wait
until consensus is reached on whether we should add an arbitrary extra
level of indirection here.

>
> http://reviews.llvm.org/D19782
>
> Files:
>   include/llvm/InitializePasses.h
>   include/llvm/Transforms/IPO/GlobalDCE.h
>   lib/LTO/LTOCodeGenerator.cpp
>   lib/Passes/PassBuilder.cpp
>   lib/Passes/PassRegistry.def
>   lib/Transforms/IPO/GlobalDCE.cpp
>   lib/Transforms/IPO/IPO.cpp
>   test/Transforms/GlobalDCE/basicvariabletest.ll
>
> Index: test/Transforms/GlobalDCE/basicvariabletest.ll
> ===================================================================
> --- test/Transforms/GlobalDCE/basicvariabletest.ll
> +++ test/Transforms/GlobalDCE/basicvariabletest.ll
> @@ -1,4 +1,4 @@
> -; RUN: opt < %s -globaldce -S | FileCheck %s
> +; RUN: opt < %s -passes=globaldce -S | FileCheck %s
>  
>  ; CHECK-NOT: global
>  @X = external global i32
> Index: lib/Transforms/IPO/IPO.cpp
> ===================================================================
> --- lib/Transforms/IPO/IPO.cpp
> +++ lib/Transforms/IPO/IPO.cpp
> @@ -29,7 +29,7 @@
>    initializeDAEPass(Registry);
>    initializeDAHPass(Registry);
>    initializeForceFunctionAttrsLegacyPassPass(Registry);
> -  initializeGlobalDCEPass(Registry);
> +  initializeGlobalDCELegacyPassPass(Registry);
>    initializeGlobalOptLegacyPassPass(Registry);
>    initializeIPCPPass(Registry);
>    initializeAlwaysInlinerPass(Registry);
> Index: lib/Transforms/IPO/GlobalDCE.cpp
> ===================================================================
> --- lib/Transforms/IPO/GlobalDCE.cpp
> +++ lib/Transforms/IPO/GlobalDCE.cpp
> @@ -15,6 +15,7 @@
>  //
>  //===----------------------------------------------------------------------===//
>  
> +#include "llvm/Transforms/IPO/GlobalDCE.h"
>  #include "llvm/ADT/SmallPtrSet.h"
>  #include "llvm/ADT/Statistic.h"
>  #include "llvm/IR/Constants.h"
> @@ -34,29 +35,36 @@
>  STATISTIC(NumVariables, "Number of global variables removed");
>  
>  namespace {
> -  struct GlobalDCE : public ModulePass {
> +  class GlobalDCELegacyPass : public ModulePass {
> +  public:
>      static char ID; // Pass identification, replacement for typeid
> -    GlobalDCE() : ModulePass(ID) {
> -      initializeGlobalDCEPass(*PassRegistry::getPassRegistry());
> +    GlobalDCELegacyPass() : ModulePass(ID) {
> +      initializeGlobalDCELegacyPassPass(*PassRegistry::getPassRegistry());
>      }
>  
>      // run - Do the GlobalDCE pass on the specified module, optionally updating
>      // the specified callgraph to reflect the changes.
>      //
> -    bool runOnModule(Module &M) override;
> +    bool runOnModule(Module &M) override {
> +      if (skipModule(M))
> +        return false;
>  
> +      auto PA = Impl.run(M);
> +      return !PA.areAllPreserved();
> +    }
> +
>    private:
> -    SmallPtrSet<GlobalValue*, 32> AliveGlobals;
> -    SmallPtrSet<Constant *, 8> SeenConstants;
> -    std::unordered_multimap<Comdat *, GlobalValue *> ComdatMembers;
> +    GlobalDCEPass Impl;
> +  };
> +}
>  
> -    /// GlobalIsNeeded - mark the specific global value as needed, and
> -    /// recursively mark anything that it uses as also needed.
> -    void GlobalIsNeeded(GlobalValue *GV);
> -    void MarkUsedGlobalsAsNeeded(Constant *C);
> +char GlobalDCELegacyPass::ID = 0;
> +INITIALIZE_PASS(GlobalDCELegacyPass, "globaldce",
> +                "Dead Global Elimination", false, false)
>  
> -    bool RemoveUnusedGlobalValue(GlobalValue &GV);
> -  };
> +// Public interface to the GlobalDCEPass.
> +ModulePass *llvm::createGlobalDCEPass() {
> +  return new GlobalDCELegacyPass();
>  }
>  
>  /// Returns true if F contains only a single "ret" instruction.
> @@ -68,16 +76,7 @@
>    return RI.getReturnValue() == nullptr;
>  }
>  
> -char GlobalDCE::ID = 0;
> -INITIALIZE_PASS(GlobalDCE, "globaldce",
> -                "Dead Global Elimination", false, false)
> -
> -ModulePass *llvm::createGlobalDCEPass() { return new GlobalDCE(); }
> -
> -bool GlobalDCE::runOnModule(Module &M) {
> -  if (skipModule(M))
> -    return false;
> -
> +PreservedAnalyses GlobalDCEPass::run(Module &M) {
>    bool Changed = false;
>  
>    // Remove empty functions from the global ctors list.
> @@ -188,12 +187,14 @@
>    SeenConstants.clear();
>    ComdatMembers.clear();
>  
> -  return Changed;
> +  if (Changed)
> +    return PreservedAnalyses::none();
> +  return PreservedAnalyses::all();
>  }
>  
>  /// GlobalIsNeeded - the specific global value as needed, and
>  /// recursively mark anything that it uses as also needed.
> -void GlobalDCE::GlobalIsNeeded(GlobalValue *G) {
> +void GlobalDCEPass::GlobalIsNeeded(GlobalValue *G) {
>    // If the global is already in the set, no need to reprocess it.
>    if (!AliveGlobals.insert(G).second)
>      return;
> @@ -231,7 +232,7 @@
>    }
>  }
>  
> -void GlobalDCE::MarkUsedGlobalsAsNeeded(Constant *C) {
> +void GlobalDCEPass::MarkUsedGlobalsAsNeeded(Constant *C) {
>    if (GlobalValue *GV = dyn_cast<GlobalValue>(C))
>      return GlobalIsNeeded(GV);
>  
> @@ -251,7 +252,7 @@
>  // so, nuke it.  This will reduce the reference count on the global value, which
>  // might make it deader.
>  //
> -bool GlobalDCE::RemoveUnusedGlobalValue(GlobalValue &GV) {
> +bool GlobalDCEPass::RemoveUnusedGlobalValue(GlobalValue &GV) {
>    if (GV.use_empty())
>      return false;
>    GV.removeDeadConstantUsers();
> Index: lib/Passes/PassRegistry.def
> ===================================================================
> --- lib/Passes/PassRegistry.def
> +++ lib/Passes/PassRegistry.def
> @@ -36,6 +36,7 @@
>  #define MODULE_PASS(NAME, CREATE_PASS)
>  #endif
>  MODULE_PASS("forceattrs", ForceFunctionAttrsPass())
> +MODULE_PASS("globaldce", GlobalDCEPass())
>  MODULE_PASS("globalopt", GlobalOptPass())
>  MODULE_PASS("inferattrs", InferFunctionAttrsPass())
>  MODULE_PASS("internalize", InternalizePass())
> Index: lib/Passes/PassBuilder.cpp
> ===================================================================
> --- lib/Passes/PassBuilder.cpp
> +++ lib/Passes/PassBuilder.cpp
> @@ -47,6 +47,7 @@
>  #include "llvm/Target/TargetMachine.h"
>  #include "llvm/Transforms/IPO/ForceFunctionAttrs.h"
>  #include "llvm/Transforms/IPO/FunctionAttrs.h"
> +#include "llvm/Transforms/IPO/GlobalDCE.h"
>  #include "llvm/Transforms/IPO/GlobalOpt.h"
>  #include "llvm/Transforms/IPO/InferFunctionAttrs.h"
>  #include "llvm/Transforms/IPO/Internalize.h"
> Index: lib/LTO/LTOCodeGenerator.cpp
> ===================================================================
> --- lib/LTO/LTOCodeGenerator.cpp
> +++ lib/LTO/LTOCodeGenerator.cpp
> @@ -104,7 +104,7 @@
>    initializeInstructionCombiningPassPass(R);
>    initializeSimpleInlinerPass(R);
>    initializePruneEHPass(R);
> -  initializeGlobalDCEPass(R);
> +  initializeGlobalOptLegacyPassPass(R);
>    initializeArgPromotionPass(R);
>    initializeJumpThreadingPass(R);
>    initializeSROALegacyPassPass(R);
> Index: include/llvm/Transforms/IPO/GlobalDCE.h
> ===================================================================
> --- include/llvm/Transforms/IPO/GlobalDCE.h
> +++ include/llvm/Transforms/IPO/GlobalDCE.h
> @@ -0,0 +1,48 @@
> +//===-- GlobalDCE.h - DCE unreachable internal functions ------------------===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +//
> +// This transform is designed to eliminate unreachable internal globals from the
> +// program.  It uses an aggressive algorithm, searching out globals that are
> +// known to be alive.  After it finds all of the globals which are needed, it
> +// deletes whatever is left over.  This allows it to delete recursive chunks of
> +// the program which are unreachable.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +#ifndef LLVM_TRANSFORMS_IPO_GLOBALDCE_H
> +#define LLVM_TRANSFORMS_IPO_GLOBALDCE_H
> +
> +#include "llvm/IR/Module.h"
> +#include "llvm/IR/PassManager.h"
> +#include <unordered_map>
> +
> +namespace llvm {
> +
> +/// Pass to remove unused function declarations.
> +class GlobalDCEPass {
> +public:
> +  static StringRef name() { return "GlobalDCEPass"; }

Better to use the PassInfoMixin CRTP helper base class instead of
defining name() yourself.

> +  GlobalDCEPass() {}

Leave this out - it's the same as the implicit constructor anyway.

> +  PreservedAnalyses run(Module &M);
> +
> +private:
> +  SmallPtrSet<GlobalValue*, 32> AliveGlobals;
> +  SmallPtrSet<Constant *, 8> SeenConstants;
> +  std::unordered_multimap<Comdat *, GlobalValue *> ComdatMembers;
> +
> +  /// GlobalIsNeeded - mark the specific global value as needed, and

Drop "GlobalIsNeeded -" from the comment. We don't do that anymore in
new code.

> +  /// recursively mark anything that it uses as also needed.
> +  void GlobalIsNeeded(GlobalValue *GV);
> +  void MarkUsedGlobalsAsNeeded(Constant *C);
> +  bool RemoveUnusedGlobalValue(GlobalValue &GV);
> +};
> +
> +}
> +
> +#endif // LLVM_TRANSFORMS_IPO_GLOBALDCE_H
> Index: include/llvm/InitializePasses.h
> ===================================================================
> --- include/llvm/InitializePasses.h
> +++ include/llvm/InitializePasses.h
> @@ -142,7 +142,7 @@
>  void initializeGCMachineCodeAnalysisPass(PassRegistry&);
>  void initializeGCModuleInfoPass(PassRegistry&);
>  void initializeGVNLegacyPassPass(PassRegistry&);
> -void initializeGlobalDCEPass(PassRegistry&);
> +void initializeGlobalDCELegacyPassPass(PassRegistry&);
>  void initializeGlobalOptLegacyPassPass(PassRegistry&);
>  void initializeGlobalsAAWrapperPassPass(PassRegistry&);
>  void initializeIPCPPass(PassRegistry&);


More information about the llvm-commits mailing list